package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.business.BairroBusiness;
import br.com.business.CidadeBusiness;
import br.com.business.EnderecoParceiroBusiness;
import br.com.business.GradeProdutosBusiness;
import br.com.business.RamoAtividadeBusiness;
import br.com.business.UfBusiness;
import br.com.businesssql.EnderecoParceiroBusinessSql;
import br.com.data.Bairro;
import br.com.data.Cidade;
import br.com.data.EnderecoParceiro;
import br.com.data.GradeProdutos;
import br.com.data.Parceiro;
import br.com.data.RamoAtividade;
import br.com.data.Uf;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.database.data.Criterio;
import br.com.utilidades.faces.SimpleMessageBean;
import constantes.CONSTANTES;

/**
 * @version 1.0.0
 * @since Janeiro,29 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("session")
public class DescontoBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = 207809205556949377L;

    private List<Uf> ufs;
    private Uf uf;

    private List<Cidade> cidades;
    private Cidade cidade;

    private List<Bairro> bairros;
    private Bairro bairro;

    private List<RamoAtividade> ramoAtividades;
    private RamoAtividade ramoAtividade;

    private String nomeEstabelecimento;

    private UfBusiness ufBusinessImpl;
    private CidadeBusiness cidadeBusinessImpl;
    private BairroBusiness bairroBusinessImpl;
    private RamoAtividadeBusiness tipoParceiroBusinessImpl;
    private GradeProdutosBusiness gradeProdutosBusinessImpl;

    private EnderecoParceiroBusinessSql enderecoParceiroBusinessSqlImpl;

    private List<EnderecoParceiro> enderecoParceiros;

    private Integer quantidadeEnderecoParceiros;

    private SessionUsaPreBean sessionUsaPreBean;

    private List<GradeProdutos> gp;
    private Parceiro parceiroEscolhido;
    private EnderecoParceiro enderecoParceiroEscolhido;

    private String latLong;

    /**
     * Construtor
     */
    @Autowired
    public DescontoBean(UfBusiness ufBusinessImpl, RamoAtividadeBusiness tipoParceiroBusinessImpl,
	    CidadeBusiness cidadeBusinessImpl, BairroBusiness bairroBusinessImpl, SessionUsaPreBean sessionUsaPreBean,
	    EnderecoParceiroBusiness enderecoParceiroImpl, EnderecoParceiroBusinessSql enderecoParceiroBusinessSqlImpl,
	    GradeProdutosBusiness gradeProdutosBusinessImpl) {

	this.bairroBusinessImpl = bairroBusinessImpl;
	this.cidadeBusinessImpl = cidadeBusinessImpl;
	this.ufBusinessImpl = ufBusinessImpl;
	this.tipoParceiroBusinessImpl = tipoParceiroBusinessImpl;
	this.sessionUsaPreBean = sessionUsaPreBean;

	this.enderecoParceiroBusinessSqlImpl = enderecoParceiroBusinessSqlImpl;

	this.gradeProdutosBusinessImpl = gradeProdutosBusinessImpl;

	reset();
    }

    /**
     * reset
     */
    public void reset() {

	ramoAtividades = tipoParceiroBusinessImpl.buscarPorNomeBusca("");

	bairros = new ArrayList<Bairro>();
	cidades = new ArrayList<Cidade>();

	ufs = ufBusinessImpl.buscarPorNomeBusca("");

	for (Uf uft : ufs) {
	    if (uft.getId().equals(CONSTANTES.COD_ESTADO_PADRAO)) {
		uf = uft;
	    }
	}

	atualizaCidade();

	for (Cidade cidadet : cidades) {
	    if (cidadet.getId().equals(CONSTANTES.COD_CIDADE_PADRAO)) {
		cidade = cidadet;
	    }
	}

	atualizaBairro();

	nomeEstabelecimento = "";

	enderecoParceiros = new ArrayList<EnderecoParceiro>();

	latLong = "";

    }

    /**
     * atualizaCidade
     */
    public void atualizaCidade() {

	if (uf == null) {

	} else {

	    cidades = new ArrayList<Cidade>();

	    List<Criterio> criterios = new ArrayList<Criterio>();
	    Criterio crit = new Criterio();
	    crit.setCampo("uf.id");
	    crit.setComparacao(" = ");
	    crit.setValue(uf.getId());
	    crit.setTipo(Criterio.TIPO_INTEGER);
	    criterios.add(crit);

	    cidades = cidadeBusinessImpl.buscarPorCriterios(criterios, " nome ");

	}

    }

    /**
     * atualizaBairro
     */
    public void atualizaBairro() {

	if (cidade == null) {

	} else {

	    bairros = new ArrayList<Bairro>();

	    List<Criterio> criterios = new ArrayList<Criterio>();
	    Criterio crit = new Criterio();
	    crit.setCampo("cidade.id");
	    crit.setComparacao(" = ");
	    crit.setValue(cidade.getId());
	    crit.setTipo(Criterio.TIPO_INTEGER);
	    criterios.add(crit);

	    bairros = bairroBusinessImpl.buscarPorCriterios(criterios, " nome ");
	}

    }

    /**
     * comparar
     */
    public void comparar() {

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getUsuario() == null || sessionUsaPreBean.getUsuario().getId() == null) {
		String precisaEstarLogado = super.getMensagem("MN_voce_precisa_estar_logado");
		enviaMensagem(precisaEstarLogado, precisaEstarLogado);
	    } else {
		if (sessionUsaPreBean.getUsuario().getOrigemUsuario().equals("USA-PRÉ")) {
		    try {
			FacesContext.getCurrentInstance().getExternalContext()
				.redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoMinhaLista.jsf");
		    } catch (Exception ex) {
			ex.printStackTrace();
		    }
		} else {
		    String usuarioNaoLiberado = super.getMensagem("MN_seu_usuario_nao_liberado");
		    enviaMensagem(usuarioNaoLiberado, usuarioNaoLiberado);
		}
	    }

	} else {
	    String favorLogar = super.getMensagem("MN_favor_logar_primeiro");
	    enviaMensagem(favorLogar, favorLogar);
	}
    }

    /**
     * voltar
     */
    public void voltar() {

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoRedeDesconto.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	} else {
	    String favorLogarPrimeiro = super.getMensagem("MN_favor_logar_primeiro");
	    enviaMensagem(favorLogarPrimeiro, favorLogarPrimeiro);
	}

    }

    /**
     * produtos
     */
    public void produtos() {

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    if (sessionUsaPreBean.getUsuario() == null || sessionUsaPreBean.getUsuario().getId() == null) {
		String precisaSerUsuario = super.getMensagem("MN_voce_precisa_ser_usuario");
		enviaMensagem(precisaSerUsuario, precisaSerUsuario);
	    } else {
		if (sessionUsaPreBean.getUsuario().getOrigemUsuario().equals("USA-PRÉ")) {
		    try {

			parceiroEscolhido = enderecoParceiroEscolhido.getParceiro();
			gp = gradeProdutosBusinessImpl.buscarGradePorParceiro(parceiroEscolhido);

			Boolean impar = Boolean.TRUE;
			for (GradeProdutos g : gp) {
			    g.setImpar(impar);
			    if (impar)
				impar = Boolean.FALSE;
			    else
				impar = Boolean.TRUE;
			}

			FacesContext.getCurrentInstance().getExternalContext()
				.redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoRedeDescontoProdutos.jsf");
		    } catch (Exception ex) {
			ex.printStackTrace();
		    }
		} else {
		    String cadastroNaoLiberado = super.getMensagem("MN_seu_usuario_nao_liberado");
		    enviaMensagem(cadastroNaoLiberado, cadastroNaoLiberado);
		}
	    }
	} else {
	    String favorLogar = super.getMensagem("MN_favor_logar_primeiro");
	    enviaMensagem(favorLogar, favorLogar);
	}
    }

    /**
     * voltarRedeDesconto
     */
    public void voltarRedeDesconto() {

	latLong = "";

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoRedeDesconto.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	} else {
	    String favorLogar = super.getMensagem("MN_favor_logar_primeiro");
	    enviaMensagem(favorLogar, favorLogar);
	}
    }

    /**
     * voltarRedeCompletaUsaCard
     */
    public void voltarRedeCompletaUsaCard() {

	latLong = "";

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoRedeCompletaUsaCard.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	} else {
	    String favorLogar = super.getMensagem("MN_favor_logar_primeiro");
	    enviaMensagem(favorLogar, favorLogar);
	}

    }

    /**
     * voltarRamodeAtividade
     */
    public void voltarRamodeAtividade() {

	latLong = "";

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividadeLogado.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividade.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}

    }

    /**
     * mapaRedeCompleta
     */
    public void mapaRedeCompleta() {

	latLong = "";
	String enderecoNaodefinidoMapa = super.getMensagem("MN_endereco_nao_definido_mapa");

	if (enderecoParceiroEscolhido.getLatitude() == null || enderecoParceiroEscolhido.getLatitude().equals("")) {

	    enviaMensagem(enderecoNaodefinidoMapa, enderecoNaodefinidoMapa);

	} else {

	    if (enderecoParceiroEscolhido.getLongitude() == null || enderecoParceiroEscolhido.getLongitude().equals("")) {

		enviaMensagem(enderecoNaodefinidoMapa, enderecoNaodefinidoMapa);

	    } else {

		latLong = enderecoParceiroEscolhido.getLatitude() + ", " + enderecoParceiroEscolhido.getLongitude();

		if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
		    try {
			FacesContext.getCurrentInstance().getExternalContext()
				.redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoRedeCompletaUsaCardMapa.jsf");
		    } catch (Exception ex) {
			ex.printStackTrace();
		    }
		} else {
		    String favorLogar = super.getMensagem("MN_favor_logar_primeiro");
		    enviaMensagem(favorLogar, favorLogar);
		}

	    }

	}

    }

    /**
     * mapaRamoAtividade
     */
    public void mapaRamoAtividade() {

	latLong = "";
	String enderecoNaodefinidoMapa = super.getMensagem("MN_endereco_nao_definido_mapa");

	if (enderecoParceiroEscolhido.getLatitude() == null || enderecoParceiroEscolhido.getLatitude().equals("")) {

	    enviaMensagem(enderecoNaodefinidoMapa, enderecoNaodefinidoMapa);

	} else {

	    if (enderecoParceiroEscolhido.getLongitude() == null || enderecoParceiroEscolhido.getLongitude().equals("")) {

		enviaMensagem(enderecoNaodefinidoMapa, enderecoNaodefinidoMapa);

	    } else {

		latLong = enderecoParceiroEscolhido.getLatitude() + ", " + enderecoParceiroEscolhido.getLongitude();

		if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
		    try {
			FacesContext.getCurrentInstance().getExternalContext()
				.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividadeMapaLogado.jsf");
		    } catch (Exception ex) {
			ex.printStackTrace();
		    }
		} else {
		    try {
			FacesContext.getCurrentInstance().getExternalContext()
				.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividadeMapa.jsf");
		    } catch (Exception ex) {
			ex.printStackTrace();
		    }
		}
	    }
	}
    }

    /**
     * mapaRedeDesconto
     */
    public void mapaRedeDesconto() {

	latLong = "";
	String enderecoNaodefinidoMapa = super.getMensagem("MN_endereco_nao_definido_mapa");

	if (enderecoParceiroEscolhido.getLatitude() == null || enderecoParceiroEscolhido.getLatitude().equals("")) {

	    enviaMensagem(enderecoNaodefinidoMapa, enderecoNaodefinidoMapa);

	} else {

	    if (enderecoParceiroEscolhido.getLongitude() == null || enderecoParceiroEscolhido.getLongitude().equals("")) {

		enviaMensagem(enderecoNaodefinidoMapa, enderecoNaodefinidoMapa);

	    } else {

		latLong = enderecoParceiroEscolhido.getLatitude() + ", " + enderecoParceiroEscolhido.getLongitude();

		if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
		    try {
			FacesContext.getCurrentInstance().getExternalContext()
				.redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoRedeDescontoMapa.jsf");
		    } catch (Exception ex) {
			ex.printStackTrace();
		    }
		} else {
		    String favorLogar = super.getMensagem("MN_favor_logar_primeiro");
		    enviaMensagem(favorLogar, favorLogar);
		}

	    }

	}

    }

    /**
     * buscarCompreComDesconto
     */
    public void buscarCompreComDesconto() {

	this.enderecoParceiros = enderecoParceiroBusinessSqlImpl.buscarEnderecosParceirosPorEnderecoeRamodeAtividade(
		uf, bairro, cidade, ramoAtividade, nomeEstabelecimento);

	quantidadeEnderecoParceiros = enderecoParceiros.size();

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividadeLogado.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividade.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}

    }

    public boolean isEnderecoEmpty() {
	return enderecoParceiros.isEmpty();
    }

    /**
     * buscarConsulteCompareCompre
     */
    public void buscarConsulteCompareCompre() {

	enderecoParceiros = new ArrayList<EnderecoParceiro>();

	this.enderecoParceiros = enderecoParceiroBusinessSqlImpl.buscarEnderecosParceirosPorEnderecoeRamodeAtividade(
		uf, bairro, cidade, ramoAtividade, nomeEstabelecimento);

	quantidadeEnderecoParceiros = enderecoParceiros.size();

    }

    /**
     * descontosTela
     */
    public void descontosTela() {

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividadeLogado.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/descontosPorRamoDeAtividade.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}

    }

    /**
     * buscarRedeCompletaUsaCard
     */
    public void buscarRedeCompletaUsaCard() {

	this.enderecoParceiros = enderecoParceiroBusinessSqlImpl.buscarEnderecosParceirosPorEnderecoeRamodeAtividade(
		uf, bairro, cidade, ramoAtividade, nomeEstabelecimento);

	quantidadeEnderecoParceiros = enderecoParceiros.size();

	if (sessionUsaPreBean.getLogado().equals(Boolean.TRUE)) {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/listaEstabelecimentosLogado.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	} else {
	    try {
		FacesContext.getCurrentInstance().getExternalContext()
			.redirect("/" + CONSTANTES.URLUSAPRE + "/listaEstabelecimentos.jsf");
	    } catch (Exception ex) {
		ex.printStackTrace();
	    }
	}

    }

    // SETS AND GETS
    public List<Uf> getUfs() {
	return ufs;
    }

    public void setUfs(List<Uf> ufs) {
	this.ufs = ufs;
    }

    public Uf getUf() {
	return uf;
    }

    public void setUf(Uf uf) {
	this.uf = uf;
    }

    public List<Cidade> getCidades() {
	return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
	this.cidades = cidades;
    }

    public Cidade getCidade() {
	return cidade;
    }

    public void setCidade(Cidade cidade) {
	this.cidade = cidade;
    }

    public List<Bairro> getBairros() {
	return bairros;
    }

    public void setBairros(List<Bairro> bairros) {
	this.bairros = bairros;
    }

    public Bairro getBairro() {
	return bairro;
    }

    public void setBairro(Bairro bairro) {
	this.bairro = bairro;
    }

    public String getNomeEstabelecimento() {
	return nomeEstabelecimento;
    }

    public void setNomeEstabelecimento(String nomeEstabelecimento) {
	this.nomeEstabelecimento = nomeEstabelecimento;
    }

    public List<RamoAtividade> getRamoAtividades() {
	return ramoAtividades;
    }

    public void setRamoAtividades(List<RamoAtividade> ramoAtividades) {
	this.ramoAtividades = ramoAtividades;
    }

    public RamoAtividade getRamoAtividade() {
	return ramoAtividade;
    }

    public void setRamoAtividade(RamoAtividade ramoAtividade) {
	this.ramoAtividade = ramoAtividade;
    }

    public List<EnderecoParceiro> getEnderecoParceiros() {
	return enderecoParceiros;
    }

    public void setEnderecoParceiros(List<EnderecoParceiro> enderecoParceiros) {
	this.enderecoParceiros = enderecoParceiros;
    }

    public Parceiro getParceiroEscolhido() {
	return parceiroEscolhido;
    }

    public void setParceiroEscolhido(Parceiro parceiroEscolhido) {
	this.parceiroEscolhido = parceiroEscolhido;
    }

    public List<GradeProdutos> getGp() {
	return gp;
    }

    public void setGp(List<GradeProdutos> gp) {
	this.gp = gp;
    }

    public EnderecoParceiro getEnderecoParceiroEscolhido() {
	return enderecoParceiroEscolhido;
    }

    public void setEnderecoParceiroEscolhido(EnderecoParceiro enderecoParceiroEscolhido) {
	this.enderecoParceiroEscolhido = enderecoParceiroEscolhido;
    }

    public String getLatLong() {
	return latLong;
    }

    public void setLatLong(String latLong) {
	this.latLong = latLong;
    }

    public Integer getQuantidadeEnderecoParceiros() {
	return quantidadeEnderecoParceiros;
    }

    public void setQuantidadeEnderecoParceiros(Integer quantidadeEnderecoParceiros) {
	this.quantidadeEnderecoParceiros = quantidadeEnderecoParceiros;
    }

}
